package demo;

import demo.factory.AppleStore;
import demo.factory.Shop;
import demo.factory.XiaomiFansClub;
import demo.product.pad.Pad;
import demo.product.phone.Phone;

/**
 * 核心是生产一个集合的产品，生产出来的每个集合代表集合不同的态。
 * 如果新增不同等级的集合产品只需要再实现一个工厂类实例，则符合开闭原则，
 * 如果是需要在这个集合内加入新的产品，需要修改工厂类的接口，则不符合开闭原则。
 * 抽象工厂和工厂模式的区别:
 * 在于，工厂模式只生产一大类对象，而抽象工厂可以生产好几大类对象，就是所谓1和n的区别。
 * 抽象工厂模式存在灵活性差的问题，变更时会违反开比原则
 *
 * @author ZhouWeiBo
 * @create 2022/6/6
 */
public class App {
    public static void main(String[] args) {
        Shop xiaomiShop = new XiaomiFansClub();
        Shop appleShop = new AppleStore();
        Pad iPad = appleShop.sellPad();
        iPad.watchMovie("战狼2");
        Pad xiaomiPad = xiaomiShop.sellPad();
        xiaomiPad.watchMovie("复仇者联盟");

        Phone iPhone = appleShop.sellPhone();
        iPhone.call("13000000000");
        Phone xiaomiPhone = xiaomiShop.sellPhone();
        xiaomiPhone.call("15888888888");
    }
}
